/**
 * JDPreferences.java	01/02/2012
 */

package l3.info.Projet.Serveur;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Properties;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import l3.info.Projet.Client.JDAPropos;
import l3.info.Projet.Utilitaires.Configuration;
import l3.info.Projet.Utilitaires.Chiffrement;

/**
 * Fenêtre modale pour configuration du client
 * @author Loïc Martinez
 * @version 1.0
 */

public class JDPreferencesServeur extends JDialog implements ActionListener {

	private static final String TITRE = "Préférences";
	private static final String OK = "OK";
	private static final String ANNULER = "Annuler";
	private static final int LARGEUR = 290;
	private static final int HAUTEUR = 190;
	private static final int ABSCISSE = 480;
	private static final int ORDONNEE = 280;
	private JLabel labelBD, labelUsername, labelPassword, labelPort;
	private JTextField textFieldBD, textFieldUsername, textFieldPort;
	private JButton valider, annuler;
	private JPanel firstPan, panLabel, panBouton;
	private JPasswordField textFieldPassword;
	private Configuration conf;
	
	/**
	 * Constructeur
	 * @param erreur, le message à afficher
	 */
	public JDPreferencesServeur(Configuration conf) {
		this.conf = conf;
		setProperties();
		addComponents(FlowLayout.CENTER);
		loadConfiguration();
		setEnter();
		setVisible(true);
	}

	/**
	 * Configuration des propriétés de la JFrame
	 */
	private void setProperties() {
		setTitle(TITRE);
		setBounds(ABSCISSE, ORDONNEE, LARGEUR, HAUTEUR);
		setResizable(false);
		setModal(true);
		getContentPane().setLayout(new FlowLayout());
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		firstPan = new JPanel(new FlowLayout());
		firstPan.setPreferredSize(new Dimension(LARGEUR, 5));
		add(firstPan);
	}

	/**
	 * Ajout du label et du bouton
	 * @param alignement, la position des éléments
	 * @param erreur, la valeur du JLabel
	 */
	private void addComponents(int alignement) {
		panLabel = new JPanel(new FlowLayout(alignement));
		panLabel.setPreferredSize(new Dimension(LARGEUR, 100));
		labelBD = new JLabel("Base de données ");
		
		textFieldBD = new JTextField(10);
		
		panLabel.add(labelBD);
		panLabel.add(textFieldBD);
		
		labelUsername = new JLabel("Nom d'utilisateur " + " ");
		textFieldUsername = new JTextField(10);
		
		panLabel.add(labelUsername);
		panLabel.add(textFieldUsername);
		
		labelPassword = new JLabel("Mot de passe " + "       ");
		textFieldPassword = new JPasswordField(10);
		
		panLabel.add(labelPassword);
		panLabel.add(textFieldPassword);
		
		labelPort = new JLabel("Port BD" + "                   ");
		textFieldPort = new JTextField(10);
		
		panLabel.add(labelPort);
		panLabel.add(textFieldPort);
		
		add(panLabel);

		panBouton = new JPanel(new FlowLayout(alignement));
		panBouton.setPreferredSize(new Dimension(LARGEUR, 50));
		valider = new JButton(OK);
		valider.addActionListener(this);
		panBouton.add(valider);
		annuler = new JButton(ANNULER);
		annuler.addActionListener(this);
		panBouton.add(annuler);
		add(panBouton);
	}
	
	/**
	 * Charge la configuration dans chaque JTextField
	 */
	public void loadConfiguration() {
		textFieldBD.setText(conf.valueOf("database"));
		textFieldUsername.setText(conf.valueOf("user"));
		textFieldPassword.setText(Chiffrement.crypt(conf.valueOf("password")));
		textFieldPort.setText(conf.valueOf("port"));
	}

	/**
	 * Si on appuie sur Entrée, alors ça déclenche le listener
	 * du bouton bouton
	 */
	public void setEnter() {
		getRootPane().setDefaultButton(valider);
	}

	/**
	 * @return le nom de la base de données
	 */
	public String getDatabaseName() {
		return textFieldBD.getText();
	}
	
	/**
	 * @return le nom avec lequel on se connecte à la base de données
	 */
	public String getUsername() {
		return textFieldUsername.getText();
	}
	
	/**
	 * @return le mot de passe chiffré avec RSA
	 */
	public String getPasswordMD5() {
		return Chiffrement.crypt(String.valueOf
				(textFieldPassword.getPassword()));
	}
	
	public int getPort() {
		try {
			return Integer.parseInt(textFieldPort.getText());
		} catch (NumberFormatException ex) {
			// Retourner le port par défaut de la base de données ?
			return -1;
		}
	}
	
	/**
	 * Permet de gérer les actions sur les ActionListeners
	 */
	public void actionPerformed(ActionEvent ev) {
		if (ev.getSource() == valider) { // Ecrire avec Configuration
			// On modifie le fichier de configuration avec les valeurs entr�es
			conf.modifierValeur("database", textFieldBD.getText());
			conf.modifierValeur("user", textFieldUsername.getText());
			conf.modifierValeur("password", Chiffrement.crypt
					(String.valueOf(textFieldPassword.getPassword())));
			conf.modifierValeur("port", textFieldPort.getText());
			setVisible(false);
			dispose();
		} else if (ev.getSource() == annuler) { // Ne rien faire
			setVisible(false);
			dispose();
		}
	}
}
